import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor, HttpHeaders, HttpEventType, HttpResponse
} from '@angular/common/http';
import {catchError, Observable, tap, throwError} from 'rxjs';

@Injectable()
export class CorsInterceptor implements HttpInterceptor {
  public clientId = 'client-angular';
  public redirectUri = 'http://127.0.0.1:8090/'; // 建议通过配置获取  8090是资源地址
  private backendServerUrl = 'http://127.0.0.1:8080'; // 建议通过配置获取

  constructor() {}


  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // 如果是预检请求，手动处理重定向
    // if (request.method === 'OPTIONS') {
    //   // 这里可以添加逻辑来处理预检请求的重定向
    //   const body = request.body;
    //   body(204); // Return a 204 for a preflight request
    // }
    // if (request.url.startsWith(this.backendServerUrl)) {
    //   // 如果请求地址以后端服务器地址开头，则将其转换为跨域请求
    //   const corsRequest = request.clone({
    //     url: request.url.replace(this.backendServerUrl, this.redirectUri),
    //     withCredentials: true,
    //     responseType: 'json', // 默认为json，根据你的需求修改
    //   });
    //   return next.handle(corsRequest).pipe(
    //     catchError((error) => {
    //       console.error('CORS error:', error);
    //       return throwError(error);
    //     })
    //   );
    // }
    console.log('CORS 拦截生效 ==============:', request.url, request.headers);
    // 在这里，你可以修改请求头以适应CORS要求，例如添加认证信息或自定义头
    const modifiedRequest = request.clone({
      headers: request.headers //.set('Custom-Header', 'value') // 示例：添加一个自定义请求头
        .set('Access-Control-Allow-Origin', [/*'http://127.0.0.1:9000',*/ 'http://127.0.0.1:8080'/*, 'http://127.0.0.1:4200'*/]) //, 'http://127.0.0.1:4200' 注意：这个设置通常由服务器端处理，不应在客户端设置
        .set('Access-Control-Allow-Methods', '*') // 允许的HTTP方法 GET, POST, PUT, DELETE, OPTIONS
        .set('Access-Control-Allow-Headers', '*') // 允许的请求头  X-Requested-With, Content-Type, Authorization
        .set('Access-Control-Allow-Credentials', 'true') // 允许携带认证信息
      ,
      withCredentials: true,
      responseType: 'json', // 默认为json，根据你的需求修改

    });

    console.log('CORS 拦截生效2==:', modifiedRequest.headers);
    // 对预检请求（OPTIONS）做出回应
    //if (request.method === 'OPTIONS') {
      return next.handle(modifiedRequest).pipe(
        tap((event: HttpEvent<any>) => {
          if (event.type === HttpEventType.Response) {
            // 如果是响应，确保有正确的 CORS 响应头
            const response = event as HttpResponse<any>;
            response.headers.set('Access-Control-Allow-Origin', 'http://127.0.0.1:8080, http://127.0.0.1:9000');  //, http://127.0.0.1:4200  8080
            response.headers.set('Access-Control-Allow-Credentials', 'true');
            response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
            response.headers.set('Access-Control-Allow-Headers', '*');  //Content-Type, X-Requested-With, Authorization
          }
        }),
        catchError(err => this.handleError(err))
      );
    // } else {
    //   // 对其他请求转发
    //   return next.handle(modifiedRequest).pipe(
    //     tap((event: HttpEvent<any>) => {
    //       if (event.type === HttpEventType.Response) {
    //         // 如果是响应，确保有正确的 CORS 响应头
    //         const response = event as HttpResponse<any>;
    //         response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
    //         response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    //       }
    //     }),
    //     catchError(err => this.handleError(err))
    //   );
    // }

    // 将修改后的请求传递给下一个处理器
    // return next.handle(modifiedRequest).pipe(
    //   // 可以在这里添加错误处理逻辑，比如重试机制等
    //
    //   catchError(error => {
    //       // this.handleError(error);
    //     console.error('CORS error: ', error);
    //       return throwError(error);
    //     }
    //   )
    // );
  }

  private handleError(error: any) {
    // 处理错误，这里只是一个简单的示例
    console.error('An error occurred =====:', error);
    return throwError(error);
  }

  // intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  //   // 改进跨域请求的判断逻辑
  //   if (!req.url.startsWith(this.backendServerUrl)) {
  //     req = this.addCORSHeaders(req);
  //   } else {
  //     req = this.addCredentialsToRequest(req, next);
  //   }
  //
  //
  //
  //   return next.handle(req).pipe(
  //     catchError(error => {
  //       this.handleError(error);
  //       return throwError(error);
  //     })
  //   );
  // }
  //
  // private  addCORSHeaders(req: HttpRequest<any>): HttpRequest<any> {
  //   const header = new HttpHeaders({
  //     'Access-Control-Allow-Origin': '*',
  //     'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  //     'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With, Authorization'
  //   });
  //
  //
  //   // @ts-ignore
  //   return req.clone({ setHeaders: header });
  // }
  //
  // private addCredentialsToRequest(req: HttpRequest<any>, next: HttpHandler): HttpRequest<any> {
  //   const newReq = req.clone({
  //     url: this.backendServerUrl + req.url,
  //     withCredentials: true,
  //     setHeaders: {
  //       'Access-Control-Allow-Origin': '*',
  //       'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  //       'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With, Authorization'
  //     }
  //   });
  //
  //   return newReq;
  // }
  //
  // private handleError(error: any) {
  //   console.error('Error during request interception', error);
  //   // 实际项目中，这里可以进一步对错误进行处理，例如记录到日志服务、返回用户友好的错误消息等
  // }
  //
  // private addToken(header: HttpHeaders, req: HttpRequest<any>) {
  //   if (req.headers.get('Authorization')) {
  //     // @ts-ignore
  //     header.append('Authorization', req.headers.get('Authorization'));
  //   } else {
  //     header.append('Authorization', 'Bearer ' + this.clientId);
  //   }
  //
  //   // 排除不需要认证的api
  //   if (!this.needIdentity(req.url)) {
  //     return header;
  //   }
  //   const token = localStorage.getItem('token');
  //   if (token) {
  //     header.append('token', token);
  //   }
  //   return header;
  // }
  //
  // private needIdentity(url: string): boolean {
  //   // 根据实际需求实现，这里只是一个示例
  //   return true;
  // }

}
